#include "desktopfilefix.h"
#include "ui_desktopfilefix.h"

desktopfilefix::desktopfilefix(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::desktopfilefix)
{
    ui->setupUi(this);
}

desktopfilefix::~desktopfilefix()
{
    delete ui;
}

void desktopfilefix::on_filePathBtn_clicked()
{
    QString file = QFileDialog::getOpenFileName(this, "打开…","/usr/share/applications/","桌面入口文件 (*.desktop)");
    ui->filePathtext->setText(file);
}


void desktopfilefix::on_startBtn_clicked()
{
    updateStatus("开始修复…");

    // 修补类型
    int fixFlag;
    if(ui->electronButton->isChecked()) {
        updateStatus("选择了Electron桌面文件修复…");
        fixFlag = 0;
    }
    else if(ui->steamButton->isChecked()) {
        updateStatus("选择了Steam桌面文件修复…");
        fixFlag = 1;
    }
    else {
        updateStatus("错误：没有选择修复类型。");
        updateStatus("结束");
        return;
    }

    // 读文件
    updateStatus("检查桌面文件…");
    QString path = ui->filePathtext->text();
    if(path == "") {
        updateStatus("错误：没有选择文件。");
        updateStatus("结束");
        return;
    }
    updateStatus("选择的文件路径是：" + path);

    QFile file(path);
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text)) {
        updateStatus("文件打开失败。权限问题？或者不是有效的文件？");
        updateStatus("结束");
        return;
    }
    QString dtl = QString(file.readAll());
    file.close();

    // 查入口及执行行
    QStringList dtlgroup = dtl.split("\n");
    int entryindex = dtlgroup.indexOf("[Desktop Entry]");
    if(entryindex != -1) {
        updateStatus("存在入口 " + QString::number(entryindex));
        QString exec;
        int i;
        for(i = entryindex; i < dtlgroup.length(); i++) {
            if(dtlgroup[i] == "") {
                updateStatus("错误：入口没有指令语句。");
                updateStatus("结束");
                file.close();
                return;
            }
            if(dtlgroup[i].startsWith("Exec=")) {
                updateStatus("找到执行语句。开始修复…");
                exec = dtlgroup[i].split("Exec=")[1];
                break;
            }
        }

        // 执行行加参数
        switch (fixFlag) {
        case 0: {// electron
            bool flag = 0;   // 指令修改标记
            if(!exec.contains("--enable-features=UseOZonePlatform")) {
                exec += " --enable-features=UseOZonePlatform";
                flag = 1;
            }

            if(!exec.contains("--ozone-platform=wayland")) {
                exec += " --ozone-platform=wayland";
                flag = 1;
            }

            if(!exec.contains("--enable-Wayland-ime")) {
                exec += " --enable-Wayland-ime";
                flag = 1;
            }

            if(!flag) {
                updateStatus("修补内容已存在，取消操作…");
                updateStatus("没有文件发生变更。");
                return;
            }

            dtlgroup[i] = "Exec=" + exec;
            break;
        }
        case 1: // steam
            if(exec.contains("env LANG=zh_CN.UTF-8", Qt::CaseInsensitive)) {
                updateStatus("修补内容已存在，取消操作…");
                updateStatus("没有文件发生变更。");
                return;
            }
            dtlgroup[i] = "Exec=env LANG=zh_CN.UTF-8 " + exec;
            break;
        default:
            updateStatus("错误：未知错误，没能修补文件。");
            break;
        }

        if(!file.open(QIODevice::WriteOnly|QIODevice::Text)) {
            updateStatus("文件打开失败。权限问题？或者不是有效的文件？");
            updateStatus("结束");
            file.close();
            return;
        }

        // 写入
        QTextStream writeStream(&file);
        writeStream << dtlgroup.join("\n");
        updateStatus("文件写入完毕。");


        file.close();
        updateStatus("修补完成");
    }

    else {
        updateStatus("错误：没有找到入口。选择的文件可能不是有效的desktop文件");
        updateStatus("结束");
    }
}

void desktopfilefix::updateStatus(QString msg){
    QString time = QTime::currentTime().toString("hh:mm:ss");
    ui->statusBrowser->append("<p>" + time + "\t" + msg + "</p>");
}
